package com.skyd.core.android.game;

import java.util.Random;

import com.skyd.core.math.MathEx;
import com.skyd.core.vector.Vector2DF;

import android.content.Context;
import android.content.res.Resources;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;

/**
 * 游戏管理员，用于全局控制游戏
 * 
 * @author SkyD
 * 
 */
public class GameMaster {
	/**
	 * 初始值为new Random()。 功能注释：伪随机数生成对象
	 */
	private static Random _Random = new Random();

	/**
	 * 获取Random。 功能注释：伪随机数生成对象
	 * 
	 * @return 当前的Random类型的值
	 */
	public static Random getRandom() {
		return _Random;
	}

	/**
	 * 设置Random。 功能注释：伪随机数生成对象
	 * 
	 * @param value
	 *            要设置的Random类型值
	 */
	public static void setRandom(Random value) {
		_Random = value;
	}

	/**
	 * 设置Random为其默认值(new Random())。 功能注释：伪随机数生成对象
	 */
	public static void setRandomToDefault() {
		setRandom(new Random());
	}

	/**
	 * 初始化
	 * 
	 * @param c
	 *            上下文对象
	 */
	public static void init(Context c) {
		Display d = ((WindowManager) c.getSystemService(Context.WINDOW_SERVICE))
				.getDefaultDisplay();
		setScreenHeight(d.getHeight());
		setScreenWidth(d.getWidth());
		_Context=c;
	}
	
	/**
 * 初始值为null。
 * 功能注释：获取上下文对象
 */
	private static  Context _Context = null;
/**
 * 获取Context。
 * 功能注释：获取上下文对象
 * @return 当前的Context类型的值
 */
	public static  Context getContext() {
		return _Context;
	}
///**
// * 设置Context。
// * 功能注释：获取上下文对象
// * @param value 要设置的Context类型值
// */
//	public static  void setContext(Context value) {
//		_Context = value;
//	}	
///**
// * 设置Context为其默认值(null)。
// * 功能注释：获取上下文对象
// */
//	public static  void setContextToDefault() {
//		setContext(null);
//	}

	/**
	 * 初始值为0。 功能注释：当前设备屏幕高度
	 */
	private static int _ScreenHeight = 0;

	/**
	 * 获取ScreenHeight。 功能注释：当前设备屏幕高度
	 * 
	 * @return 当前的int类型的值
	 */
	public static int getScreenHeight() {
		return _ScreenHeight;
	}

	/**
	 * 设置ScreenHeight。 功能注释：当前设备屏幕高度
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	public static void setScreenHeight(int value) {
		_ScreenHeight = value;
	}

	/**
	 * 设置ScreenHeight为其默认值(0)。 功能注释：当前设备屏幕高度
	 */
	public static void setScreenHeightToDefault() {
		setScreenHeight(0);
	}

	/**
	 * 初始值为0。 功能注释：当前设备屏幕宽度
	 */
	private static int _ScreenWidth = 0;

	/**
	 * 获取ScreenWidth。 功能注释：当前设备屏幕宽度
	 * 
	 * @return 当前的int类型的值
	 */
	public static int getScreenWidth() {
		return _ScreenWidth;
	}

	/**
	 * 设置ScreenWidth。 功能注释：当前设备屏幕宽度
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	public static void setScreenWidth(int value) {
		_ScreenWidth = value;
	}

	/**
	 * 设置ScreenWidth为其默认值(0)。 功能注释：当前设备屏幕宽度
	 */
	public static void setScreenWidthToDefault() {
		setScreenWidth(0);
	}

	/**
	 * 在对象与一个点之间做胶囊碰撞检测
	 * 
	 * @param obj
	 *            胶囊测试对象
	 * @param point
	 *            测试点
	 * @return 是否发生碰撞
	 */
	public static boolean executeVerticalCapsuleHitTest(
			IGameVerticalCapsuleHitTest obj, Vector2DF point) {
		float t = obj.getVerticalCapsuleHitTestY();
		float b = t + obj.getVerticalCapsuleHitTestHeight();
		float x = obj.getVerticalCapsuleHitTestX();
		float r = obj.getVerticalCapsuleHitTestRadius();
		if (point.getY() < t) {
			return MathEx.distance(x, t, point.getX(), point.getY()) <= r;
		} else if (point.getY() > b) {
			return MathEx.distance(x, b, point.getX(), point.getY()) <= r;
		} else {
			return Math.abs(point.getX() - x) <= r;
		}
	}

	/**
	 * 在对象与一个点之间做矩形碰撞测试
	 * 
	 * @param obj
	 *            矩形测试对象
	 * @param point
	 *            测试点
	 * @return 是否发生碰撞
	 */
	public static boolean executeRectHitTest(IGameRectHitTest obj,
			Vector2DF point) {
		return point.getX() <= obj.getRectHitTestRight()
				&& point.getX() >= obj.getRectHitTestLeft()
				&& point.getY() <= obj.getRectHitTestBottom()
				&& point.getY() >= obj.getRectHitTestTop();
	}

	/**
	 * 获取在给定Y轴上的X轴左边界值，如果给定的Y轴超出对象所在Y轴区间则返回最左端X值
	 * 
	 * @param obj
	 *            胶囊测试对象
	 * @param limitY
	 *            限定Y轴坐标值
	 * @return X轴左边界值
	 */
	public static float getVerticalCapsuleLeftBound(
			IGameVerticalCapsuleHitTest obj, float limitY) {
		float t = obj.getVerticalCapsuleHitTestY();
		float b = t + obj.getVerticalCapsuleHitTestHeight();
		float x = obj.getVerticalCapsuleHitTestX();
		float r = obj.getVerticalCapsuleHitTestRadius();
		if (limitY < t - r || limitY > b + r)
			return x - r;
		if (limitY < t) {
			return x
					- (float) Math.sqrt(Math.pow(r, 2)
							- Math.pow(t - limitY, 2));
		}
		if (limitY > b && limitY <= b + r) {
			return x
					- (float) Math.sqrt(Math.pow(r, 2)
							- Math.pow(limitY - b, 2));
		}
		return x - r;
	}

	/**
	 * 获取在给定Y轴上的X轴右边界值，如果给定的Y轴超出对象所在Y轴区间则返回最右端X值
	 * 
	 * @param obj
	 *            胶囊测试对象
	 * @param limitY
	 *            限定Y轴坐标值
	 * @return X轴右边界值
	 */
	public static float getVerticalCapsuleRightBound(
			IGameVerticalCapsuleHitTest obj, float limitY) {
		float t = obj.getVerticalCapsuleHitTestY();
		float b = t + obj.getVerticalCapsuleHitTestHeight();
		float x = obj.getVerticalCapsuleHitTestX();
		float r = obj.getVerticalCapsuleHitTestRadius();
		if (limitY < t - r || limitY > b + r)
			return x + r;
		if (limitY < t) {
			return x
					+ (float) Math.sqrt(Math.pow(r, 2)
							- Math.pow(t - limitY, 2));
		}
		if (limitY > b && limitY <= b + r) {
			return x
					+ (float) Math.sqrt(Math.pow(r, 2)
							- Math.pow(limitY - b, 2));
		}
		return x + r;
	}

	/**
	 * 获取在给定X轴上的Y轴上边界值，如果给定的X轴超出对象所在X轴区间则返回最上端Y值
	 * 
	 * @param obj
	 *            胶囊测试对象
	 * @param limitX
	 *            限定X轴坐标值
	 * @return Y轴上边界值
	 */
	public static float getVerticalCapsuleTopBound(
			IGameVerticalCapsuleHitTest obj, float limitX) {
		float t = obj.getVerticalCapsuleHitTestY();
		float x = obj.getVerticalCapsuleHitTestX();
		float r = obj.getVerticalCapsuleHitTestRadius();
		if (limitX < x - r || limitX > x + r)
			return t - r;
		if (limitX < x) {
			return (float) (t - Math.sqrt(Math.pow(r, 2)
					- Math.pow(x - limitX, 2)));
		}
		if (limitX > x) {
			return (float) (t - Math.sqrt(Math.pow(r, 2)
					- Math.pow(limitX - x, 2)));
		}
		return t - r;
	}

	/**
	 * 获取在给定X轴上的Y轴下边界值，如果给定的X轴超出对象所在X轴区间则返回最下端Y值
	 * 
	 * @param obj
	 *            胶囊测试对象
	 * @param limitX
	 *            限定X轴坐标值
	 * @return Y轴下边界值
	 */
	public static float getVerticalCapsuleBottomBound(
			IGameVerticalCapsuleHitTest obj, float limitX) {
		float t = obj.getVerticalCapsuleHitTestY();
		float b = t + obj.getVerticalCapsuleHitTestHeight();
		float x = obj.getVerticalCapsuleHitTestX();
		float r = obj.getVerticalCapsuleHitTestRadius();
		if (limitX < x - r || limitX > x + r)
			return b + r;
		if (limitX < x) {
			return (float) (b + Math.sqrt(Math.pow(r, 2)
					- Math.pow(x - limitX, 2)));
		}
		if (limitX > x) {
			return (float) (b + Math.sqrt(Math.pow(r, 2)
					- Math.pow(limitX - x, 2)));
		}
		return b + r;
	}
	
	/**
	 * 记录日志
	 * @param sender 触发对象
	 * @param msg 信息内容
	 */
	public static void log(Object sender,Object msg)
	{
		Log.d("SkyD_LOG", sender.getClass().getName()+" : "+msg);
	}
	
	/**
	 * 获取资源
	 * @return 资源对象
	 */
	public static Resources getResources(){
		return getContext().getResources();
	}
}
